/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package TablasAuxiliares;

import Negocio.*;
import BaseDatos.GestorBD;
import Util.GestorErrores;
import Util.Varios;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

/**
 *
 * @author Javi
 */

public class TACamposPremisas implements ObjetoDatos{
    //Nombre de la tabla de la Base de Datos
    private String _sNombreTabla = "CamposPremisas";
    //Descripción de la tabla de la Base de Datos
    private String _sDescripTabla = "Campos disponibles para las Premisas de las Reglas";
    //Condición where
    private String sCondWhere = "";

    private String _sTabla;
    private String _sCampo;
    private String _sTipo;
    private String _sTablaAux;

    /*
     * Recupera todo el contenido de la tabla y lo devuelvo en 2 vectores. Uno con los nombres de los campos y
     * otro vector de vectores con los datos propiamente dichos (cada tupla de datos en un vector). El orden de los
     * campos de la fila es el mismo que el de los nombres de los campos.
     */
    public boolean selectAll ( Vector columnIdentifiers, Vector dataVector){
        String sCondicion = "";
        //Si hay alguna condición se añade a la sentencia
        if (this.sCondWhere.compareTo("") != 0)
            sCondicion = " WHERE " + this.sCondWhere;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs = st.executeQuery("SELECT Tabla, Campo, Tipo, TablaAux FROM " +
                    this._sNombreTabla + sCondicion + " ORDER BY Tabla, Campo");
            ResultSetMetaData metaDatos = rs.getMetaData();
            // Se obtiene el número de columnas.
            int numeroColumnas = metaDatos.getColumnCount();
            // Se obtiene cada una de las etiquetas para cada columna
            for (int i = 0; i < numeroColumnas; i++){
               // Nuevamente, para ResultSetMetaData la primera columna es la 1.
               columnIdentifiers.addElement( metaDatos.getColumnLabel(i + 1) );
            }

            while (rs.next()) {
                // Se crea un vector que será cada fila de la tabla.
                Vector fila = new Vector (numeroColumnas);

                // Se rellena cada posición del vector con una de las columnas de la tabla en base de datos.
                for (int i = 0; i < numeroColumnas; i++)
                    fila.addElement ( rs.getObject(i+1) ); // El primer indice en rs es el 1, no el cero, por eso se suma 1.

                // Se añade al modelo la fila completa.
                dataVector.addElement( fila );
            }
            rs.close();
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Recupera solo los diferentes nombres de las tablas y lo devuelvo en 2 vectores. Uno con los nombres de los campos y
     * otro vector de vectores con los datos propiamente dichos (cada tupla de datos en un vector). El orden de los
     * campos de la fila es el mismo que el de los nombres de los campos.
     */
    public boolean selectAllDistinct ( Vector columnIdentifiers, Vector dataVector){
       try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs = st.executeQuery("SELECT DISTINCT Tabla FROM " +
                    this._sNombreTabla + " ORDER BY Tabla");
            ResultSetMetaData metaDatos = rs.getMetaData();
            // Se obtiene el número de columnas.
            int numeroColumnas = metaDatos.getColumnCount();
            // Se obtiene cada una de las etiquetas para cada columna
            for (int i = 0; i < numeroColumnas; i++){
               // Nuevamente, para ResultSetMetaData la primera columna es la 1.
               columnIdentifiers.addElement( metaDatos.getColumnLabel(i + 1) );
            }

            while (rs.next()) {
                // Se crea un vector que será cada fila de la tabla.
                Vector fila = new Vector (numeroColumnas);

                // Se rellena cada posición del vector con una de las columnas de la tabla en base de datos.
                for (int i = 0; i < numeroColumnas; i++)
                    fila.addElement ( rs.getObject(i+1) ); // El primer indice en rs es el 1, no el cero, por eso se suma 1.

                // Se añade al modelo la fila completa.
                dataVector.addElement( fila );
            }
            rs.close();
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Inserta un registro en la tabla
     */
    public boolean insert ( ){
        if ( !validar () )
            return false;
        String sSQL = "INSERT INTO " + this._sNombreTabla + " (Tabla, Campo, Tipo, TablaAux) " +
            "VALUES (" +
            "'" + this._sTabla + "', '" + this._sCampo + "', '" +  this._sTipo + "', '" + this._sTablaAux + "')";
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Actualiza un registro en la entidad auxiliar
     */
    public boolean update ( ){
        if ( !validar () )
            return false;
        String sSQL = "UPDATE " + this._sNombreTabla + " SET Tipo = '" + this._sTipo + "', " +
            " TablaAux = '" + this._sTablaAux + "'" +
             " WHERE Tabla = '" + this._sTabla + "' AND Campo ='" + this._sCampo + "'";
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Borra un registro
     */
    public boolean delete (){
        String sSQL = "DELETE FROM " + this._sNombreTabla +
             " WHERE Tabla = '" + this._sTabla + "' AND Campo ='" + this._sCampo + "'";
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    public boolean validar() {
        if ( this._sTabla.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El nombre de la tabla es obligatorio");
        if ( this._sCampo.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El nombre del Campo es obligatorio");
        if ( this._sTipo.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El tipo del Campo es obligatorio");
        return (GestorErrores.getInstancia().getvErrores().size () == 0);
    }

    public void vectorJTableAClavesClase(Vector columnIdentifiers, Vector dataRow) {
        this.inicializa();
        int iIndice = Varios.getPosCadena(columnIdentifiers, "Tabla");
        this._sTabla = dataRow.get(iIndice).toString();
        iIndice = Varios.getPosCadena(columnIdentifiers, "Campo");
        this._sCampo = dataRow.get(iIndice).toString();
    }

    public Vector claseAVectorJTable(Vector columnIdentifiers) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void recupera() {
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs;
            rs = st.executeQuery("SELECT * FROM " + this._sNombreTabla + " WHERE " +
            " Tabla = '" + this._sTabla + "' AND Campo = '" + this._sCampo + "'");
            if ( rs.next() ) {
                this._sTabla = rs.getString("Tabla");
                this._sCampo = rs.getString("Campo");
                this._sTipo = rs.getString("Tipo");
                this._sTablaAux = rs.getString("TablaAux");
            }
            rs.close();
            st.close();

        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public void inicializa() {
        this._sTabla = "";
        this._sCampo = "";
        this._sTipo = "";
        this._sTablaAux = "";
    }


    public String getsDescripTabla() {
        return _sDescripTabla;
    }

    public void setsDescripTabla(String _sDescripTabla) {
        this._sDescripTabla = _sDescripTabla;
    }

    public String getsNombreTabla() {
        return _sNombreTabla;
    }

    public void setsNombreTabla(String _sNombreTabla) {
        this._sNombreTabla = _sNombreTabla;
    }

    public String getsCondWhere() {
        return sCondWhere;
    }

    public void setsCondWhere(String sCondWhere) {
        this.sCondWhere = sCondWhere;
    }

    public String getsCampo() {
        return _sCampo;
    }

    public void setsCampo(String _sCampo) {
        this._sCampo = _sCampo;
    }

    public String getsTabla() {
        return _sTabla;
    }

    public void setsTabla(String _sTabla) {
        this._sTabla = _sTabla;
    }

    public String getsTablaAux() {
        return _sTablaAux;
    }

    public void setsTablaAux(String _sTablaAux) {
        this._sTablaAux = _sTablaAux;
    }

    public String getsTipo() {
        return _sTipo;
    }

    public void setsTipo(String _sTipo) {
        this._sTipo = _sTipo;
    }


}
